<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>

</body>




<script>

  const obj = {
    name:'mt',
    age:24,
    hobby:{
      a:'1',
      b:2
    },
    video:['yutube','bilibili']
  }

  const o={}

  //浅拷贝es6语法糖
  // Object.assign(o,obj)
  // console.log(o);
  //
  // o.hobby.a='fucku'
  // console.log(obj);


  //深拷贝 递归实现
  function deepcopy(newobj,oldobj) {
    for (var k in oldobj)
    {
      //先判断是不是数组，后判断是不是对象 因为数组也是对象
      let item = oldobj[k]
      if (item instanceof Array){
        newobj[k]= []
        deepcopy(newobj[k],item)
      }else if (item instanceof Object){
        newobj[k] = {}
        deepcopy(newobj[k],item)
      }else {
        newobj[k]= oldobj[k]
      }
    }

  }

  deepcopy(o,obj)
  console.log(o);
  o.hobby.a = 'fucku'
  console.log(obj);


  // setTimeout(() => console.log('setTimeout1'), 0);  //1宏任务
 // setTimeout(() => {								//2宏任务
 //   console.log('setTimeout2');
 //   Promise.resolve().then(() => {
 //     console.log('promise2');
 //     Promise.resolve(
 //     ).then(() => {
 //       console.log('promise3');
 //     })
 //     console.log(5)
 //   })
 //   setTimeout(() => console.log('setTimeout4'), 0);  //4宏任务
 // }, 0);
 // setTimeout(() => console.log('setTimeout3'), 0);  //3宏任务
 // Promise.resolve().then(() => {//1微任务
 //   console.log('promise1');
 // })
 // console.log('start')



  //
  // console.log('打印'+1);
  //
  // setTimeout(function(){
  //   console.log('打印'+2);
  // })
  //
  // var p = new Promise(function(resolve){
  //   console.log('打印'+3);
  //   resolve();
  // })
  //
  // console.log('打印'+10);
  //
  // new Promise(function(resolve,reject){
  //   setTimeout(function () {
  //     console.log('打印'+5);
  //     p.then(console.log('打印'+4))
  //   });
  //
  // }).then(
  //   console.log('打印'+6)
  // );
  //
  // console.log('打印'+11);
  // setTimeout(function(){
  //   console.log('打印' + 9);
  //   new Promise(function(resolve,reject){
  //     console.log('打印'+7);
  //   });
  // })

 // setTimeout(function(){
 //   console.log(1);
 // },0);
 // setTimeout(function(){
 //   console.log(2);
 // },0);
 // new Promise(function(resolve){
 //   console.log(3);
 //   resolve();
 //   console.log(4);
 // }).then(function(){
 //   console.log(5);
 // });
 // console.log(6);
 //
 // console.log(8);


 // function add(a){
 //   function sum(b){
 //     a =   a+b;
 //     return sum;
 //   }
 //   sum.toString = function(){
 //     return a;
 //   }
 //   return sum;
 // }
 //
 // console.log(+add(1)(2)(3))


  // const map = new Map()
  // const o ={ p: 'hello world'}
  // const a = ['a']
  // map.set(o,'content')
  // map.set(a,'contentarry')
  // map.set({ p: 'hello world'},'content2')
  // map.set(['a'],'contentarry2')
  //
  //
  //
  // console.log(map.get(o));
  // console.log(map.get(a));
  //
  // console.log(map.get(['a']));
  // console.log(map.get({ p: 'hello world'}));
  //
  // console.log(map);
  //
  //
  //
  // var addTwoNumbers = function(l1, l2) {
  //   let head = null, tail = null;
  //   let carry = 0;
  //
  //   while (l1 || l2) {
  //     const n1 = l1 ? l1.val : 0;
  //     const n2 = l2 ? l2.val : 0;
  //     const sum = n1 + n2 + carry;
  //     if (!head) {
  //       head = tail = new ListNode(sum % 10);
  //     } else {
  //       tail.next = new ListNode(sum % 10);
  //       tail = tail.next;
  //     }
  //     carry = Math.floor(sum / 10);
  //     if (l1) {
  //       l1 = l1.next;
  //     }
  //     if (l2) {
  //       l2 = l2.next;
  //     }
  //   }
  //   if (carry > 0) {
  //     tail.next = new ListNode(carry);
  //   }
  //   return head;
  // };


 //
 // setTimeout(() => {
 //   console.log(1)
 // })
 //
 // setTimeout(() => {
 //   new Promise((resolve, reject) => {
 //     console.log(2)
 //     resolve()
 //   }).then(() => {
 //     console.log(3)
 //   })
 // })
 //
 // console.log(4)
 //
 // new Promise((resolve, reject) => {
 //   console.log(5)
 //   resolve()
 // }).then(() => {
 //   console.log(6)
 // })
 //
 // new Promise((resolve, reject) => {
 //   console.log(7)
 //   setTimeout(() => {
 //     console.log(8)
 //   })
 //   resolve()
 // }).then(() => {
 //   console.log(9)
 // })

 //*******************************5.Spread / Rest 操作符***********************
  //Spread / Rest 操作符指的是 ...，具体是 Spread 还是 Rest 需要看上下文语境。
 // //当被用于迭代器中时，它是一个 Spread 操作符：
 // function foo(x,y,z) {
 //   console.log(x,y,z);
 // }
 // let arr = [1,2,3];
 // foo(...arr); // 1 2 3
 //
 // //当被用于函数传参时，是一个 Rest 操作符：当被用于函数传参时，是一个 Rest 操作符：
 // function foo(...args) {
 //   console.log(args);
 // }
 // foo( 1, 2, 3); // [1, 2, 3, 4, 5]


 //********************6.二进制、八进制、十六进制字面量********************
 // let oValue = 0o10; //八进制 0x 16进制； 0o 8进制 ；0b 2进制
 // console.log(oValue); // 8
 //
 // let bValue = 0b10; // 二进制使用 `0b` 或者 `0B`
 // console.log(bValue); // 2

 //********************7.对象和数组解构********************
 // // 对象
 // const student = {
 //   name: 'Sam',
 //   age: 22,
 //   sex: '男'
 // }
 // // 数组
 // // const student = ['Sam', 22, '男'];
 //
 // // // ES5；
 // // const name = student.name;
 // // const age = student.age;
 // // const sex = student.sex;
 // // console.log(name + ' --- ' + age + ' --- ' + sex);
 //
 // // ES6
 // const { name, age, sex } = student;
 // console.log(name + ' --- ' + age + ' --- ' + sex);

 //********************8.对象超类 *ES6 允许在对象中使用 super 方法：*********************
 //  var parent ={
 //    foo(){
 //      console.log('hello from parent');
 //    }
 //  }
 //
 //  var mother ={
 //    foo(){
 //      console.log('hello from mother');
 //    }
 //  }
 //
 //  var son ={
 //
 //      foo(){
 //        super.foo()
 //        console.log('hello from son');
 //      }
 //
 //  }
 //
 //    Object.setPrototypeOf(son,parent)
 //    Object.setPrototypeOf(son,mother) //prototype只能有一个 mother会覆盖parent
 //    son.foo()
 //

 //  //********************9.for...of 和 for...in********************
 // let letters = ['a', 'b', 'c'];
 // for (let letter of letters) {
 //   console.log(letter);
 // }
 //
 // let stus = ["Sam", "22", "男"];
 // for (let stu in stus) { //stu 为 0 ，1 ，2
 //   console.log(stus[stu]);
 // }
 //





 // ********************10.ES6中的类 ES6 中支持 class 语法********************
 //  class father {
 //    constructor() {
 //      console.log("I'm father");
 //    }
 //  }
 // father.prototype.fuck=function () {
 //   console.log('fucku');
 // }
 //  class mother extends father{
 //    constructor() {
 //      super()
 //      console.log("I'm mother");
 //    }
 //  }
 //
 //
 //  class MI extends mother {
 //    constructor() {
 //      super();
 //      console.log("I'm a student");
 //    }
 //  }
 //
 //  let me = new MI();
 //  console.log(MI.prototype);


</script>
</body>
</html>
